home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / viewers / hv12 / src / hicolor.c < prev    next >
C/C++ Source or Header  |  1992-07-05  |  4KB  |  220 lines

  1. #include <dos.h>
  2. #include <math.h>
  3. #include <stdarg.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <pc.h>
  7.  
  8. #include "hicolor.h"
  9.  
  10. /*  CONSTANTS  */
  11. #define bytesPerPixel        2
  12. #define INFORM_PROG_NAME    "hiview"
  13. #define PAGESIZE              (64L*1024L)
  14.  
  15. /*  GLOBALS  */
  16. int i;
  17.  
  18. void 
  19. himode ()
  20. {
  21.   union REGS regs;
  22.  
  23.   regs.x.ax = 0x10f0;
  24.   regs.x.bx = 0x30;
  25.   regs.x.cx = 0;
  26.   regs.x.dx = 0;
  27.  
  28.   int86 (0x10, ®s, ®s);
  29. }
  30.  
  31. void 
  32. Textmode ()
  33. {
  34.   union REGS regs;
  35.  
  36.   regs.x.ax = 0x03;
  37.   regs.x.bx = 0x0;
  38.   regs.x.cx = 0;
  39.   regs.x.dx = 0;
  40.  
  41.   int86 (0x10, ®s, ®s);
  42. }
  43.  
  44. void 
  45. Putpixel (x, y, r, g, b)
  46.      int x, y;
  47.      char r, g, b;
  48. {
  49.   union REGS regs;
  50.  
  51.   if (x < 800 && y < 600)
  52.     {
  53.       regs.h.ah = 0x0c;
  54.       regs.h.al = ((g & 7) << 5) + (b & 31);
  55.       regs.x.bx = 0;
  56.       regs.x.cx = 2 * x;
  57.       regs.x.dx = y;
  58.  
  59.       int86 (0x10, ®s, ®s);
  60.  
  61.       regs.h.ah = 0x0c;
  62.       regs.h.al = ((g & 24) >> 3) + ((r & 31) << 2);
  63.       regs.x.bx = 0;
  64.       regs.x.cx = 2 * x + 1;
  65.       regs.x.dx = y;
  66.  
  67.       int86 (0x10, ®s, ®s);
  68.     }
  69. }
  70.  
  71.  
  72.  
  73. /*
  74. main()
  75. {
  76. int  i, j;
  77. char r, g, b;
  78. int  d1, d2, d3;
  79.  
  80. himode();
  81.  
  82. for ( j=0; j<800; j+= 1 )
  83.   for ( i=0; i<600; i+=1 )
  84.     {
  85.     d1 = (int)sqrt( (double)i*(double)i + (double)j*(double)j );
  86.     d2 = (int)sqrt( (double)(j-800)*(double)(j-800) + (double)i*(double)i );
  87.     d3 = (int)sqrt( (double)(i-600)*(double)(i-600) + (double)(j-400)*(double)(j-400) );
  88.  
  89.     r = ((d1/8)%32);
  90.     g = ((d2/8)%32);
  91.     b = ((d3/8)%32);
  92.     Putpixel(j, i, r, g, b );
  93.     }
  94.  
  95. printf("I'm finished.\n");
  96. getch();
  97. Textmode();
  98. printf("Hello, World!\n");
  99. getch();
  100. }
  101.   */
  102.  
  103. /*
  104.     NAME
  105.         PutVideoRow30H - display a row in High-Color mode 30h (800x600x32K)
  106. */
  107.  
  108. void 
  109. PutVideoRow30H (
  110.          int startRow,    /* location to start display */
  111.          int startCol,    /* location to start display */
  112.          int length,    /* number of pixels to display */
  113.          WORD * buffer    /* data to be displayed */
  114. )
  115. {
  116.   static
  117.   ulong bytesPerRow = 800 * bytesPerPixel;
  118.   uint length0;
  119.   uint length1;
  120.   ulong lOffset;
  121.   uint offset;
  122.   int page;
  123.   static
  124.   ulong pagesize = 64L * 1024L;
  125.   uint segment;
  126.   unsigned short *videoptr;
  127.  
  128.   /* calculate video page and offset */
  129.   lOffset = (ulong) startRow *bytesPerRow +
  130.    (ulong) (startCol * bytesPerPixel);
  131.  
  132.   videoptr = (unsigned short *) (0xd0200000 + lOffset);
  133.   memcpy (videoptr, buffer, 2 * length);
  134. #ifdef OLDBRUCE
  135.   page = (int) (lOffset / pagesize);
  136.   SetVideoPage (page);
  137.   segment = 0xA000;
  138.   offset = (uint) (lOffset % pagesize);
  139.  
  140.  
  141.   /* display row, possibly in two parts, if it spills over page boundary */
  142.   length *= bytesPerPixel;    /* converts length units from pixels to bytes */
  143.   length0 = (uint) (pagesize - (ulong) offset);
  144.   length1 = length - length0;
  145.   if ((ulong) offset + (ulong) length < pagesize)
  146.     {
  147. /*
  148.         movedata(FP_SEG(buffer), FP_OFF(buffer), segment, offset, length);
  149. */
  150.     }
  151.   else
  152.     {
  153. /*
  154.         movedata(FP_SEG(buffer), FP_OFF(buffer), segment, offset, length0);
  155. */
  156.       SetVideoPage (page + 1);
  157.       /* in next line, have to divide length0 by 2 because it is units */
  158.       /* of bytes, and buffer is a word pointer */
  159. /*
  160.         movedata(FP_SEG(buffer), FP_OFF(buffer + length0 / 2), segment, 0, length1);
  161. */
  162.     }
  163. #endif
  164. }
  165.  
  166. void 
  167. SetHicolorMode (int mode)
  168. {
  169.   union REGS inregs;
  170.   union REGS outregs;
  171.  
  172.   inregs.h.ah = 0x10;
  173.   inregs.h.al = 0xF0;
  174.   inregs.h.bl = (unsigned char) mode;
  175.   int86 (0x10, &inregs, &outregs);
  176.   if (outregs.h.ah != 0)
  177.     {
  178.       SetVideoMode (0x03);
  179.       InformFatal ("failed to set High-Color mode");
  180.     }
  181. }
  182.  
  183. void 
  184. SetVideoMode (int mode)
  185. {
  186.   union REGS inregs;
  187.   union REGS outregs;
  188.  
  189.   inregs.h.ah = 0;
  190.   inregs.h.al = (unsigned char) mode;
  191.   int86 (0x10, &inregs, &outregs);
  192. }
  193. /*
  194.     NAME
  195.         SetVideoPage - set read/write video memory page on Tseng ET4000
  196. */
  197.  
  198. void 
  199. SetVideoPage (int page)
  200. {
  201.   outportb (0x03CD, (char) page);
  202. }
  203. /*
  204.     NAME
  205.         InformFatal - print an error message and exit
  206. */
  207.  
  208. void 
  209. InformFatal (char *fmt,...)
  210. {
  211.   va_list args;
  212.  
  213.   va_start (args, fmt);
  214.   fprintf (stderr, "\n%s: ", INFORM_PROG_NAME);
  215.   (void) vfprintf (stderr, fmt, args);
  216.   fprintf (stderr, "\n");
  217.   va_end (args);
  218.   exit (1);
  219. }
  220.